package com.pablosz.worm;

import android.graphics.Color;
import android.view.SurfaceHolder;

import com.pablosz.worm.components.Fruit;
import com.pablosz.worm.components.ProcessControl;
import com.pablosz.worm.components.ProcessControlListener;
import com.pablosz.worm.components.Score;
import com.pablosz.worm.components.Screen;
import com.pablosz.worm.components.Worm;

public class WormGame
{
	public static final String COMPONENT_WORM = "worm";
	public static final String COMPONENT_FRUIT = "fruit";
	public static final String COMPONENT_SCORE = "score";
	public static final String COMPONENT_SCREEN = "screen";
	public static final String COMPONENT_CONTROL = "control";
	
	// componentes
	private Lifecicle lifecicle = null;
	
	private ProcessControl control = null;
	private Worm worm = null;
	private Fruit fruit = null;
	private Score score = null;
	private Screen screen = null;
	
	public WormGame(int sizeWorm, int steep, int increaseUnit, int lifecicleDelay)
	{
		// instancio el worm
		worm = new Worm();
		worm.setRadio(10);
		worm.setColor(Color.GRAY);
		worm.setSteep(steep);
		worm.setSize(sizeWorm);
		worm.setIncreaseUnitSize(increaseUnit);
		worm.setLifecicleDelay(lifecicleDelay);
	
		// instancio el fruit
		fruit = new Fruit();
		
		// instancio el score
		score = new Score();
		
		// instancio el screen
		screen = new Screen();
		screen.setSquareSize(worm.getRadio()+20);
	
		// instancio el control de proceso
	   control = new ProcessControl();
	   control.setLifecicleDelay(worm.getLifecicleDelay());
	
		// instancio el control de ciclo de vida
		lifecicle = new Lifecicle();
		lifecicle.addComponent(COMPONENT_SCREEN, screen);
		lifecicle.addComponent(COMPONENT_FRUIT,fruit);
		lifecicle.addComponent(COMPONENT_WORM,worm);
		lifecicle.addComponent(COMPONENT_SCORE,score);
		lifecicle.addComponent(COMPONENT_CONTROL,control);
	}
	
	public void setProcessControlListener(ProcessControlListener lst)
	{
		control.setProcessControlListener(lst);
	}
	
	/**
	 * Reinicia el juego poniendo en cero todos sus parametros: velocidad, puntaje,
	 * tama�o del gusano, etcetera.
	 */
	public void resetGame()
	{
		lifecicle.setLifecicleState(Lifecicle.STATE_NEW);
	}
	
	/**
	 * Inicia el motor del juego dejandolo en espera del evento "touch".
	 * @param holder ver: surfaceCreated luego de implementar SurfaceHolder.Callback 
	 * en el ActivityMain
	 */
	public void startLifecicle(SurfaceHolder holder)
	{
		lifecicle.startThread(holder);
	}
	
	/**
	 * Detiene el motor del juego. 
	 */
	public void stopLifecicle()
	{
		lifecicle.stopThread();
	}
	
	/**
	 * A traves de este metodo podemos notificarle al juego que el usuario ha hecho "touch"
	 * en la pantalla.
	 */	
	public void notifyOnTouch(float x, float y)
	{
		lifecicle.notifyComponentsOnTouch((long)x, (long)y);
	}
}
